package com.xhai.common.utils.classes;

import cn.hutool.core.text.StrFormatter;

/**
 * @author xhai
 * @description 字符串工具类
 * @date 2025/5/29
 */
public class StringUtils {

    /**
     * 空字符串
     */
    private static final String NULLSTR = "";

    /**
     * 判断字符串是否为空
     *
     * @param str
     * @return
     */
    public static boolean isEmpty(String str) {
        return org.apache.commons.lang3.StringUtils.isEmpty(str);
    }

    /**
     * 判断两个字符串是否相等，忽略大小写
     *
     * @param str1
     * @param str2
     * @return
     */
    public static boolean equalsIgnoreCase(String str1, String str2) {
        return org.apache.commons.lang3.StringUtils.equalsIgnoreCase(str1, str2);
    }

    /**
     * 判断字符是否为空或空字符串或空格
     *
     * @param str
     * @return
     */
    public static boolean isNotBlank(String str) {
        return org.apache.commons.lang3.StringUtils.isNotBlank(str);
    }

    /**
     * 截取字符串
     *
     * @param str
     * @param begin
     * @param end
     * @return
     */
    public static String substring(String str, int begin, int end) {
        if (str == null) {
            return NULLSTR;
        }
        if (begin > str.length()) {
            return NULLSTR;
        }
        if (end <= 0) {
            return NULLSTR;
        }
        if (begin > end) {
            return NULLSTR;
        }

        if (begin < 0) {
            begin = 0;
        }
        if (end > str.length()) {
            end = str.length();
        }

        return str.substring(begin, end);
    }

    /**
     * 格式化文本, {} 表示占位符<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可，如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例：<br>
     * 通常使用：format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}： format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\： format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     *
     * @param template 文本模板，被替换的部分用 {} 表示
     * @param params   参数值
     * @return 格式化后的文本
     */
    public static String format(String template, Object... params) {
        if (ObjectUtils.isEmpty(params) || isEmpty(template)) {
            return template;
        }
        return StrFormatter.format(template, params);
    }
}
